package com.huakai.springenv.service;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Service
@Slf4j
public class UserService {



    @HystrixCommand(fallbackMethod = "defaultUser",
            commandProperties = {
                    // 指定执行隔离策略的超时时间（这里是1500毫秒），如果方法执行时间超过此值，则会触发降级。
                    @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1500"),
                    // 指定在一个滚动时间窗口内（通常是10秒）触发熔断的最小请求量阈值（这里是10次请求）。
                    @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "1"),
                    // 指定在滚动时间窗口内，触发熔断的错误率阈值（这里是50%），即超过一半的请求失败时触发熔断。
                    @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50"),
                    // 指定熔断器打开后的休眠时间（这里是5000毫秒），即熔断器在打开状态下等待的时间，之后会尝试半开状态下的请求。
                    @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "50000")
            },
            threadPoolProperties = {
                    // 线程池中保留的核心线程数，默认值是10。线程池会根据需要增加线程，但不会超过这个数量
                    @HystrixProperty(name = "coreSize", value = "30"),
                    // 线程池队列的最大大小。默认值是-1（表示无限制），但建议使用一个较小的正值来避免过度积压请求
                    @HystrixProperty(name = "maxQueueSize", value = "100"),
                    // 当队列大小达到这个值时，即使队列没有满，也会拒绝新的请求。默认值是5
                    @HystrixProperty(name = "queueSizeRejectionThreshold", value = "15"),
                    // 滚动窗口中统计数据的分片数量。默认值是10。这些桶用于收集和计算统计数据（例如请求成功率、失败率等
                    @HystrixProperty(name = "metrics.rollingStats.numBuckets", value = "100"),
                    // 滚动窗口的时间长度，默认值是10秒（10000毫秒）。这个窗口用于计算统计数据。
                    @HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "10000")
            })
    public String getUser(String username) {
        // 模拟获取用户信息的方法，这里设置了具体地断路器参数
        log.info("Getting user information for {}", username);
        if (username.length() > 1) {
            throw new RuntimeException("User service failed");
        }
        return username;
    }

    public String defaultUser(String username) {
        // 当获取用户信息失败时，提供默认用户信息
        return "Default User";
    }
}